home *** CD-ROM | disk | FTP | other *** search
- datatype faktor = single of int | potenz of int*int;
- datatype zerlegung = prim | zgs of faktor list;
-
- fun zerlege n =
- let fun zer'(n,d) =
- if d*d>n
- then zgs [single n]
- else
- if n mod d = 0
- then case zer'(n div d,d) of
- zgs ((single f)::t) =>
- if f=d then zgs ((potenz (f,2))::t)
- else zgs ((single d)::(single f)::t) |
- zgs ((ff as potenz (f,e))::t) =>
- if f=d then zgs ((potenz (f,e+1))::t)
- else zgs ((single d)::ff::t)
- else zer'(n,d+1)
- in
- case zer'(n,2) of
- zgs [single _] => prim |
- all => all
- end;
-
- fun pr_faktor (single n) = makestring n
- | pr_faktor (potenz (n,e)) = makestring n ^ "^" ^ makestring e;
-
- fun pr_zerl prim = "Prim"
- | pr_zerl (zgs [fak]) = pr_faktor fak
- | pr_zerl (zgs (fak::t)) = pr_faktor fak ^ " * " ^ pr_zerl (zgs t);
-
-
- fun primes n =
- let val p = open_out "CON:300/40/300/200/Primfaktoren"
- val z = ref 2
- in
- while !z <= n do
- (output(p,makestring (!z)^" = "^pr_zerl(zerlege(!z))^"\n");inc z);
- close_out p
- end;
-
-